// WaitGroup
// 用于等待一组 goroutines 完成

// 主要方法：

// Add (int): 增加等待的 goroutine 数量，“ 通常是一个正数，表示将增加多少个 goroutine。
// Done(): 在一个 goroutine 完成时调用，表示这个 goroutine 已经结束，WaitGroup 的计数器减少 1。
// Wait(): 阻塞当前 goroutine，直到 WaitGroup 中的计数器减少到 0，即所有的 goroutines 都完成。
package main

import (
	"fmt"
	"sync"
	"time"
)

func task(i int, waitGroup *sync.WaitGroup) {
	// 在函数结束时，调用 Done 方法，减少 WaitGroup 的计数器
	defer waitGroup.Done()
	fmt.Printf("任务%d开始执行\n", i)
	// 模拟任务执行时间 1s
	time.Sleep(time.Second * 1)
	fmt.Printf("任务%d执行完成\n", i)
}

func main() {
	var waitGroup sync.WaitGroup

	for i := 1; i <= 5; i++ {
		waitGroup.Add(1)
		go task(i, &waitGroup)
	}
	// 等待协程执行完成
	waitGroup.Wait()

	// 所有 goroutines 完成后，输出
	fmt.Println("All tasks finished")
}
